package com.stu.reflection.base;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class TestMethodAndField {
	public static void main(String[] args) throws Exception {
    runMethod("com.stu.reflection.base.Employee", "setId", new Class<?>[]{int.class}, 101);
    setField("com.stu.reflection.base.Employee", "name", "Bob");
	}

  /**
   * 运行任何类的公有方法
   * @param className 类名
   * @param methodName 方法名
   * @param parameterTypes 参数类型
   * @param args 参数值
   * @return 该类的一个实例
   * @throws Exception
   */
  public static Object runMethod(String className, String methodName, Class<?>[] parameterTypes, Object... args) throws Exception {
    // 获取 Class 对象，通过类名——与具体类解耦
    Class<?> clazz = Class.forName(className);
    // 创建实例，用以方法挂载
    Object obj = clazz.newInstance();
    // 获取方法，通过方法名和参数
    Method method = clazz.getMethod(methodName, parameterTypes);
    // 调用方法（非静态方法必须挂载到对象上才能执行）
    method.invoke(obj, args);
    // 输出实例
    System.out.println(obj);
    return obj;
  }
  
  /**
   * 设置任何类的任何属性
   * @param className 类名
   * @param fieldName 属性名
   * @param value 属性值
   * @return 该类的一个实例
   * @throws Exception
   */
  public static Object setField(String className, String fieldName, Object value) throws Exception {
    Class<?> clazz = Class.forName(className);
    Object obj = clazz.newInstance();
    Field field = clazz.getDeclaredField(fieldName);//获取本类属性（任意访问权限）
    field.setAccessible(true);//禁用访问安全检查
    field.set(obj, value);//设置属性
    System.out.println(obj);
    return obj;
  }
}

class Employee{
	private int id;
	private String name;
	//getter、setter、toString
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  @Override
  public String toString() {
    return "Employee [id=" + id + ", name=" + name + "]";
  }
}